package br.com.controle.ejb;

import br.com.controle.entity.Pessoa;
import br.com.controle.entity.TipoEndereco;
import br.com.controle.mdb.Mensagem;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.Session;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
 
@Stateless
@LocalBean
public class PessoaSessionBean {
    @Resource(mappedName = "jms/NotificationQueue")
    private Queue notificationQueue;
    @Resource(mappedName = "jms/NotificationQueueFactory")
    private ConnectionFactory notificationQueueFactory;

    @PersistenceContext
    private EntityManager em;    

    public List<Pessoa> retrieve() {
        Query query = em.createNamedQuery("Pessoa.findAll");
        return query.getResultList();
    }
        
    public List<TipoEndereco> getTipoEndereco(){
        Query query = em.createNamedQuery("TipoEndereco.findAll");
        return query.getResultList();
    }    
    
  public Pessoa create(Pessoa pessoa)
    {
        em.merge(pessoa); 
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(pessoa);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return pessoa;
    }    

    public Pessoa update(Pessoa pessoa)
    {           
        Pessoa updated = em.merge(pessoa); 
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(updated);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return updated;
    }
    
    public void delete(Pessoa pessoa) {
        Pessoa excluir = em.find(Pessoa.class, pessoa.getId());
        em.remove(excluir);
        
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(excluir);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }      
    
    public Pessoa getPessoa(Pessoa pessoa){
        Query query = em.createNamedQuery("Pessoa.findById").setParameter("id", pessoa.getId());
        return (Pessoa) query.getSingleResult();
    }       

     private Message createJMSMessageForjmsNotificationQueue(Session session, Object messageData) throws JMSException
    {
        //Modified to use ObjectMessage instead
        ObjectMessage tm = session.createObjectMessage();
        tm.setObject((Serializable) messageData);
        return tm;
    }

    private void sendJMSMessageToNotificationQueue(Object messageData) throws JMSException{
        Connection connection = null;
        Session session = null;
        try{
            connection = notificationQueueFactory.createConnection();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer messageProducer = session.createProducer(notificationQueue);
            messageProducer.send(createJMSMessageForjmsNotificationQueue(session, messageData));
        }
        finally{
            if (session != null){
                try{
                    session.close();
                }
                catch (JMSException e){
                    Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Cannot close session", e);
                }
            }
            if (connection != null){
                connection.close();
            }
        }
    }    
}
